home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / gnulib / gnulib3.c < prev    next >
C/C++ Source or Header  |  1990-06-26  |  2KB  |  102 lines

  1. typedef struct set_vector
  2. {
  3.   int length;
  4.   int vector[1];
  5.   /* struct set_vector *next; */
  6. } set_vector;
  7.  
  8. #ifdef sprite
  9. set_vector __CTOR_LIST__;
  10. set_vector __DTOR_LIST__;
  11. static set_vector *__dlp;
  12. static int __dli;
  13. int __1xyzzy__;
  14. #else
  15. extern set_vector __CTOR_LIST__;
  16. extern set_vector __DTOR_LIST__;
  17. set_vector *__dlp;
  18. int __dli;
  19. #endif
  20.  
  21. extern void exit ();
  22. extern void __do_global_init ();
  23. extern void __do_global_cleanup ();
  24. extern void on_exit(void*, void*);
  25.  
  26. #if defined(i386) && !defined(sequent)
  27. #define COFF
  28. #endif
  29.  
  30. #ifdef COFF_ENCAPSULATE
  31. #undef COFF
  32. #endif
  33.  
  34. #if defined(sprite)
  35. #define ON_EXIT(PROCP) \
  36.   do { extern void PROCP (); atexit (PROCP); } while (0)
  37. #endif
  38.  
  39. int
  40. __main ()
  41. {
  42.   /* Gross hack for GNU ld.  This is defined in `builtin.cc'
  43.      from libg++.  */
  44. #ifndef COFF
  45.   extern int __1xyzzy__;
  46. #endif
  47.  
  48. #ifdef ON_EXIT
  49.  
  50. #ifdef sprite
  51.   ON_EXIT (_cleanup);
  52. #endif
  53.  
  54.   ON_EXIT (__do_global_cleanup);
  55.  
  56. #endif
  57.   __dli = __DTOR_LIST__.length;
  58.   __dlp = &__DTOR_LIST__;
  59. #ifndef COFF
  60.   __do_global_init (&__1xyzzy__);
  61. #else
  62.   __do_global_init ();
  63. #endif
  64. }
  65.  
  66. #ifndef ON_EXIT
  67. void 
  68. exit (status)
  69.      int status;
  70. {
  71.   __do_global_cleanup ();
  72.   _cleanup ();
  73.   _exit (status);
  74. }
  75. #endif
  76.  
  77. void
  78. __do_global_init ()
  79. {
  80.   register int i, len;
  81.   register void (**ppf)() = (void (**)())__CTOR_LIST__.vector;
  82.  
  83.   len = __CTOR_LIST__.length;
  84.   for (i = 0; i < len; i++)
  85.     (*ppf[i])();
  86. }
  87.  
  88. void
  89. __do_global_cleanup ()
  90. {
  91.   while (__dlp)
  92.     {
  93.       while (--__dli >= 0)
  94.     {
  95.       void (*pf)() = (void (*)())__dlp->vector[__dli];
  96.       (*pf)();
  97.     }
  98.       __dlp = (struct set_vector *)__dlp->vector[__dlp->length];
  99.       if (__dlp) __dli = __dlp->length;
  100.     }
  101. }
  102.